home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / program / 441 / dlibs12 / free.c < prev    next >
C/C++ Source or Header  |  1990-11-23  |  2KB  |  77 lines

  1. #include <osbind.h>
  2. #include <stdio.h>
  3.  
  4. #define    MAXBLK        16
  5. #define    FREE        0x00
  6. #define    USED        0x80
  7. #define    NULLBLK        0x80000000L
  8.  
  9. extern    char    *_mblk[];        /* memory heap pointers */
  10. extern    long    _msiz[];        /* memory heap sizes */
  11.  
  12. static mergeblk(i)
  13.     int i;
  14. /*
  15.  *    Merge adjacent "free" blocks in heap <i>.  Links in the free chain
  16.  *    are guarenteed to be in forward order.
  17.  */
  18.     {
  19.     register long n, *p, *q;
  20.  
  21.     p = (long *) _mblk[i];
  22.     if((p = ((long *) *p)) == NULL)            /* empty chain */
  23.         return;
  24.     while(q = ((long *) p[1]))
  25.         {
  26.         n = *p;
  27.         if(((char *) p)+n == ((char *) q)) /* adjacent free block */
  28.             {
  29.             p[1] = q[1];        /* re-link free chain */
  30.             *p += *q;        /* adjust block size */
  31.             }
  32.         else
  33.             p = q;
  34.         }
  35.     /* check to see if the entire heap can be returned to the OS */
  36.     q = ((long *) (((char *) p) + (*p)));
  37.     if((((long *) _mblk[i]) == (p - 1)) && ((*q) == NULLBLK))
  38.         {
  39.         Mfree(_mblk[i]);
  40.         _mblk[i] = NULL;
  41.         _msiz[i] = 0L;
  42.         }
  43.     }
  44.  
  45. /*--------------------- Documented Functions ---------------------------*/
  46.  
  47. free(addr)
  48.     register long *addr;
  49.     {
  50.     register int i;
  51.     register long *p, *q;
  52.  
  53.     if(addr == NULL)
  54.         return(TRUE);
  55.     --addr;                    /* point to block header */
  56.     for(i=0; i<MAXBLK; ++i)
  57.         {
  58.         if((p = ((long *) _mblk[i])) == NULL)
  59.             continue;        /* skip unavailable blocks */
  60.         if((addr < p) || (addr > ((long *) (((char *) p)+_msiz[i]))))
  61.             continue;        /* block range check */
  62.         while(q = ((long *) *p))
  63.             {
  64.             ++q;
  65.             if((addr < q) && (addr > p))
  66.                 break;
  67.             p = q;
  68.             }
  69.         *((char *) addr) = FREE;    /* link into free chain */
  70.         addr[1] = *p;
  71.         *p = ((long) addr);
  72.         mergeblk(i);
  73.         return(TRUE);
  74.         }
  75.     return(FALSE);
  76.     }
  77.